[C] Rotação de Bits
Publicado por Enzo de Brito Ferber (última atualização em 11/07/2017)
[ Hits: 10.235 ]
Homepage: http://www.maximasonorizacao.com.br
Download rotate_bits.c (versão 2)
Programa com uma função de rotação de bits.
Exemplo:
rotatebits( 0010, 1, LEFT ) = 0100
rotatebits( 0100, 1, RIGHT ) = 0010
rotatebits( 0100, 2, LEFT ) = 0001
....
O código está todo em inglês porque aqui não será o único lugar que vou publicar, aí não traduzi... :P
Versão 2 - Enviado por Enzo de Brito Ferber em 22/06/2017
Changelog: Novo algoritmo usando apenas bitwise para rotações.
/* rotatebits.c * * Enzo Ferber : <enzo@veloxmail.com.br> * sep 2010 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define LEFT 1 #define RIGHT 2 /* number of binary digits */ #define BINDIGS 8 /* friendly definitions */ #define BITMASK 0x80 #define LASTBIT 0x80 #define FIRSTBIT 0x01 /* printbin(n) * * prints 'n' in binary form */ void printbin( int n ) { register int i; for( i = 0; i < BINDIGS; i++ ) printf( "%c", (( n & (BITMASK >> i)) ? '1' : '0') ); return ; } /* rotatebits( x, n, d ) * * x - number to rotate * n - n jumps * d - direction ( LEFT, RIGHT ) */ int rotatebits( int x, int n, int d ) { register int i; unsigned bit; for( i = 0; i < n; i++ ) { bit = ( d == LEFT ) ? LASTBIT : FIRSTBIT; /* saves the bit that will be lost in the shift */ bit = x & bit; /* shifts the number */ x = ( d == LEFT ) ? x << 1 : x >> 1; /* reset the lost bit in the other end of the number */ x |= ( bit ? ((d == LEFT) ? FIRSTBIT : LASTBIT ) : 0x00 ); } /* returns the new number rotated */ return x; } /* just to fool around a little bit... */ int main( int argc, char *argv[] ) { register int i, j, x; if( argc < 2 ) { printf( "Usage: %s <num1> (num2)...\n", argv[0] ); printf( "[*] At least one number must be given...\n" ); exit( 0 ); } for( j = 1; j < argc; j++ ) { for( i = 0; i <= BINDIGS; i++ ) { x = rotatebits( atoi( argv[j] ), i , LEFT); printf( "left( %d, %d ) : ", atoi( argv[j] ), i ); printbin( x ); printf( "\t\t" ); x = rotatebits( atoi( argv[j] ), i , RIGHT); printf( "right( %d, %d ): ", atoi( argv[j] ), i ); printbin( x ); puts( "" ); } puts( "\n" ); } return 0; }
Rotina para controle de portas paralelas em C. (biblioteca LP.h)
Cálculo de logaritmo de um número por Método de Newton-Raphson em C
Estrutura de dados: Lista dinâmica duplamente encadeada
[GAME-2] Acerte os rortões nas janelas (jogo com gráficos)
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Como fzr Downgrade em um pacote específico (1)
Contas online no POP OS 24.04 ? (2)
problema para barrar sites/downloas via HTTPS. (2)